package com.atguigu.test.beandefinition;

import com.atguigu.test.po.Man;
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
import org.springframework.beans.factory.xml.AbstractSingleBeanDefinitionParser;
import org.springframework.util.StringUtils;
import org.w3c.dom.Element;

/**
 * @author zp
 * @version 1.0
 * @description: 自定义组件解析类
 * 扩展 Spring 自定义标签配置一般需要以下几个步骤：
 *
 * 1、创建一个需要扩展的组件。
 * 2、定义一个 XSD 文件，用于描述组件内容。
 * 3、创建一个实现 org.springframework.beans.factory.xml.AbstractSingleBeanDefinitionParser 接口的类，用来解析 XSD 文件中的定义和组件定义。
 * 4、创建一个 Handler，继承 org.springframework.beans.factory.xml.NamespaceHandlerSupport 抽象类 ，用于将组件注册到 Spring 容器。
 * 5、编写 spring.handlers 和 Spring.schemas 文件。
 * @date 2022/12/7 18:55
 */
public class MySingleBeanDefinitionParser extends AbstractSingleBeanDefinitionParser {
    /**
     * @description: 获取返回参数的类型 也就是要操作的自定义类
     * @author zp
     * @date: 2022/12/7 19:02
     * @param element
     * @return Class<?>
     */
    @Override
    protected Class<?> getBeanClass(Element element) {
        return Man.class;
    }

    /**
     * @description: 开始处理标签上面的数值 针对不同的属性解析封装
     * @author zp
     * @date: 2022/12/7 19:03
     * @param element
     * @param builder
     */
    @Override
    protected void doParse(Element element, BeanDefinitionBuilder builder) {
        String id = element.getAttribute("id");
        String userName = element.getAttribute("userName");
        String email = element.getAttribute("email");

        if (StringUtils.hasText(id)) {
            builder.addPropertyValue("id", id);
        }

        if (StringUtils.hasText(userName)) {
            builder.addPropertyValue("userName", userName);
        }

        if (StringUtils.hasText(email)) {
            builder.addPropertyValue("email", email);
        }
    }
}
